
export default `
import { Workbook } from 'exceljs';
import { ICommonParams } from '@feidao/service/interfaces';

export default async function atom(msg: ICommonParams, action_id: string, session_id: string, spaceid: string) {
	// 文档地址 https://github.com/guyonroche/exceljs#readme
	// 使用示例 https://feidao-edu.gitee.io/taoqf/201805020916.html

	// 创建一个工作薄实例
	const wb = new Workbook();

	// 可以添加工作薄的描述
	wb.creator = 'feidao';
	// creator: string;
	// lastModifiedBy: string;
	// created: Date;
	// modified: Date;
	// lastPrinted: Date;
	// Set workbook dates to 1904 date system
	// wb.properties.date1904 = true;
	// 	wb.views = [
	//   {
	//     x: 0, y: 0, width: 10000, height: 20000,
	//     firstSheet: 0, activeTab: 1, visibility: 'visible'
	//   }
	// ]

	// 添加一个页签，可以添加多个页签

	// 不输入名称则使用默认名称，可以针对该页签添加属性
	// options = {properties:{}, pageSetup:{}, views:[{}]}
	const dict1 = wb.addWorksheet('dict1');

	dict1.addRow(['合并单元格，横向合并', '', '', '', '']);
	// 将新插入的数据进行合并
	dict1.mergeCells('A1:E1');

	dict1.addRow(['第二行数据，合并单元格，竖向', 'b2', 'c', 'd', 'e']);
	dict1.addRow(['', 'b3', '', 'd', 'e']);
	dict1.addRow(['第四行数据', 'b4', '', 'd', 'e']);
	// 将第一列，第二行第三行合并
	dict1.mergeCells('A2:A3');
	// 将第三列，第二行第三行第四行合并
	dict1.mergeCells('C2:C4');
	// 合并单元格，必须有单元格，将需要合并的单元格的内容设置为''

	// 将第四列前四行单元格设置为下拉框，下拉框的内容为固定值
	const fcol = dict1.getColumn(4);
	fcol.eachCell((cell, celNumber) => {
		if (celNumber < 5) {
			cell.dataValidation = {
				type: 'list',
				formulae: [\`"编制内,聘用,外聘兼职"\`] // 注意格式
			};
		}
	});

	// 输入小于某一个值的整数
	// 将单元格 A5
	const a5 = dict1.getCell('A5');
	a5.dataValidation = {
		type: 'whole',
		formulae: [20],
		allowBlank: true,
		operator: 'lessThan',
		error: '请输入小于20的整数',
		errorTitle: '20',
		errorStyle: 'error',
		prompt: '请输入小于20的整数---',
		promptTitle: '20哦',
		showErrorMessage: true,
		showInputMessage: true
	}

	// 只能输入某一个范围的小数或整数
	// 将单元格 B5
	const b5 = dict1.getCell('B5');
	b5.dataValidation = {
		type: 'decimal',
		formulae: [1, 20],
		allowBlank: true,
		operator: 'between',
		prompt: '请输入小于20的整数---',
		promptTitle: '20哦',
		showErrorMessage: true
	}

	// 新增新的页签，第一页签的数据来源其他页签

	const dict2 = wb.addWorksheet('dict2');
	dict2.columns = [
		{ header: 'ID', key: '_id', width: 10, hidden: true },
		{ header: '工序名称', key: 'process_name', width: 20 },
		{ header: '工序编号', key: 'process_no', width: 20 }
	];
	dict2.addRows([{ _id: '1', process_name: 'test1', process_no: '001' }, { _id: '2', process_name: 'test2', process_no: '002' }, { _id: '3', process_name: 'test3', process_no: '003' }, { _id: '4', process_name: 'test4', process_no: '004' }]);

	// 将页签dict1中下拉框的数据，来源dict2的数据
	// 将单元格 C5，选择dict2中的工序名称
	const c5 = dict1.getCell('C5');
	c5.dataValidation = {
		type: 'list',
		formulae: [\`= dict2!$B$2: $B5\`]
	}

	// 将单元格 E5，将选择的工序名称对应的工序编号显示
	const e5 = dict1.getCell('E5');
	e5.value = {
		formula: \`= VLOOKUP($C5, dict2!$B$2: dict2!$C5, 2)\`,
		result: ''
	}

	// 设置省市区类似的级联数据选择

	// 例如数据库存储的数据格式为[{id:'',name:'', pid:''}]
	const cascade_data = [{ id: '001', name: '河南省', pid: '' }, { id: '002', name: '河北省', pid: '' }, { id: '003', name: '山东省', pid: '' }, { id: '0011', name: '郑州市', pid: '001' }, { id: '0012', name: '濮阳市', pid: '001' }, { id: '00111', name: '金水区', pid: '0011' }, { id: '00112', name: '中原区', pid: '0011' }, { id: '00121', name: '南乐县', pid: '0012' }, { id: '00122', name: '清丰县', pid: '0012' }, { id: '0031', name: '聊城市', pid: '003' }, { id: '0032', name: '济南市', pid: '003' }, { id: '00311', name: '高唐县', pid: '0031' }, { id: '00312', name: '阳谷县', pid: '0031' }, { id: '00321', name: '天桥区', pid: '0032' }, { id: '0021', name: '石家庄市', pid: '002' }, { id: '0022', name: '唐山市', pid: '002' }, { id: '00211', name: '长安区', pid: '0021' }, { id: '00212', name: '新华区', pid: '0021' }, { id: '00221', name: '路北区', pid: '0022' }, { id: '00222', name: '路南区', pid: '0022' }];

	// 对数据做处理，将省、市、区数据进行分别渲染到不同的页签上

	// 省数据，数据处理后的结构符合单元格渲染数据结构，此数据结构为[['河南省'],['河北省'],['山东省']]
	const pro_data = cascade_data.filter((item) => {
		return item.pid === '';
	}).reduce((pre, cur, idx, array) => {
		const name = cur.name;
		pre.push([name]);
		return pre;
	}, []);

	const dict3 = wb.addWorksheet('省');
	dict3.addRows(pro_data);

	// 将省数据的选中放到第一个页签中的A6单元格中
	const a6 = dict1.getCell('A6');
	a6.dataValidation = {
		type: 'list',
		formulae: [\`= 省!$A$1: $A\${pro_data.length + 1 } \`]
	}

	// 市数据，数据处理后的结构符合单元格渲染数据结构，并且在渲染的市数据单元格上添加名称管理器，名称管理器的值则为市的名称，此数据结构为[['河南省',['郑州市','濮阳市']],['河北省',['石家庄市','唐山市']],['山东省',['济南市','聊城市']]
	const city_data = cascade_data.filter((item) => {
		return item.pid === '';
	}).reduce((pre, cur, idx, array) => {
		const id = cur.id;
		const name = cur.name;
		// 获取市数据
		const c_data = cascade_data.filter((info) => {
			return info.pid === id;
		}).reduce((pre, cur, idx, array) => {
			const name = cur.name;
			pre.push(name);
			return pre;
		}, []);
		const arr = [name, c_data];
		pre.push(arr);
		return pre;
	}, []);

	const dict4 = wb.addWorksheet('市');
	city_data.forEach((item, idx) => {
		const name = item[0];
		const data = item[1];
		dict4.addRow(data);
		// 获取刚渲染的行
		const r = dict4.getRow(idx + 1);
		// 获取每一个单元格，在单元格上添加名称管理器
		r.eachCell(function (cell, colNumber) {
			// 设置单元格名称管理器
			cell.addName(name);
		});
	});

	// 将市数据的选中放到第一个页签中的B6单元格中，市数据选项依赖省数据的选择
	const b6 = dict1.getCell('B6');
	b6.dataValidation = {
		type: 'list',
		formulae: [\`= INDIRECT(A6)\`]
	}

	// 区数据，数据机构和市数据结构一致并添加名称管理器
	const area_data = [];
	cascade_data.filter((item) => {
		return item.pid === '';
	}).map((pro_item) => {
		const id = pro_item.id;
		const c_data = cascade_data.filter((item) => {
			return item.pid === id;
		}).map((c_item) => {
			const cid = c_item.id;
			const name = c_item.name;
			const a_data = cascade_data.filter((item) => {
				return item.pid === cid;
			}).reduce((pre, cur, idx, array) => {
				const name = cur.name;
				pre.push(name);
				return pre;
			}, [])
			area_data.push([name, a_data]);
		})
	})

	const dict5 = wb.addWorksheet('区');
	area_data.forEach((item, idx) => {
		const name = item[0];
		const data = item[1];
		dict5.addRow(data);
		const r = dict5.getRow(idx + 1);
		r.eachCell(function (cell, colNumber) {
			// 设置单元格
			cell.addName(name);
		})
	});

	// 将区数据的选中放到第一个页签中的C6单元格中，区数据选项依赖市数据的选择
	const c6 = dict1.getCell('C6');
	c6.dataValidation = {
		type: 'list',
		formulae: [\`= INDIRECT(B6)\`]
	}

	const buff = await wb.xlsx.writeBuffer();
	return {
		buff,
		content_type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
		attachment: '单元格验证.xlsx'
	};
}
`;
